【Route53】EC2 から自身に付与されたパブリックIP を Route53 に設定したい
テクニカルサポート部の 丸屋 正志(まるちゃん)です。
参考にしたサイト一覧
- AWS CLI Command Reference CLIchange-resource-record-sets
- AWS CLI で Route53 のホストゾーンのレコードを操作してみた
- AWSで構築した環境にありがちなシェルスクリプトたち まとめ
今回は、Systemd で Route53 に登録しているレコードを更新する機会があったので、手順を展開します。
背景
EC2 インスタンスの動的パブリックIP を Route53 のレコードに登録している中で、 Stop->Start をすると、動的パブリックIP は変わってしまいその後に手動で Route53 のレコードを変更するのが大変だったので、 Systemd を使って自動化しました!
Systemd を使ってあげる事で、インスタンスが起動された際に、自動的にパブリックIP を取得して Route53 のレコードに反映をしてくれます。
やってみる
前提
今回の環境では AWS CLI 2 を使用しています。
- AMI
- Amazon Linux 2 AMI (HVM)
- AWS CLI2
aws-cli/2.1.24 Python/3.7.3 Linux/4.14.214-160.339.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
- Route53 に既に任意のドメインを登録済み
- パブリックとプライベート問わない
準備
今回は検証用として、 test01.example.me
という検証用のプライベートのホストゾーンを用意致します。
シェルスクリプトファイルの準備
手動での変更箇所
DOMAIN_NAME
="ドメイン名を入力"
(example.me)SUB_NAME
="サブドメイン名を入力"
(test01)- 不要な場合はコメントアウト
HOSTED_ZONE_ID
="ZONE-IDを入力"
各項目に対する解説
項目 | 内容 |
---|---|
Changes | 変更内容 |
Action | 変更の種類(UPSERT) |
ResourceRecordSet | 変更対象レコードの情報 |
Name | レコード名 |
Type | レコードタイプ |
TTL | レコードに関する情報をキャッシュする時間 |
ResourceRecords | 値/トラフィックのルーティング先 |
- ファイル名 : route53.sh
- ファイル場所 : /home/ec2-user/work/route53.sh
#!/bin/bash DOMAIN_NAME="example.me" SUB_NAME="test01" IP_ADDRESS=`curl -s http://169.254.169.254/latest/meta-data/public-ipv4` HOSTED_ZONE_ID="ZONE-IDを入力" BATCH_JSON='{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "'${SUB_NAME}'.'${DOMAIN_NAME}'", "Type": "A", "TTL" : 300, "ResourceRecords": [ { "Value": "'${IP_ADDRESS}'" } ] } } ] }' aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch "${BATCH_JSON}"
Systemd/サービスユニットの準備
- ファイル名 : route53_set.service
- ファイル場所 : /etc/systemd/system/route53_set.service
[Unit] Description= Route53 Set And Timer After=network-online.target [Service] ExecStart= /bin/bash /home/ec2-user/work/route53.sh WorkingDirectory=/home/ec2-user/work Type=oneshot User=ec2-user Group=ec2-user [Install] WantedBy=multi-user.target
Type=oneshot
: 一度だけコマンドを実行するタイプのサービスの場合に利用し、コマンドが終了したら起動完了と判定して、サービスも終了したものと認識。
Unit が Service として認識されたか確認
コマンドを実行して表示される事を確認
$ sudo systemctl list-unit-files --type=service | grep route53 route53_set.service disabled
デーモンリロードの実行
デーモンリロード(daemon-reload)とは、Unitファイルに加えた変更を読み込むためのものになります。
$ sudo systemctl daemon-reload
起動と自動起動の設定
下記コマンドでサービス起動と自動起動の設定が可能になります。
$ sudo systemctl enable --now route53_set.service
別タブで $ sudo journalctl -f
を実行して結果を確認していきましょう。
2月 06 16:28:11 パブリックIP systemd[1]: Starting Route53 Set And Timer... 2月 06 16:28:13 パブリックIP bash[3335]: { 2月 06 16:28:13 パブリックIP bash[3335]: "ChangeInfo": { 2月 06 16:28:13 パブリックIP bash[3335]: "Id": "/change/XXXXXXXXXXXXXXX", 2月 06 16:28:13 パブリックIP bash[3335]: "Status": "PENDING", 2月 06 16:28:13 パブリックIP bash[3335]: "SubmittedAt": "2021-02-06T16:28:12.979000+00:00" 2月 06 16:28:13 パブリックIP bash[3335]: } 2月 06 16:28:13 パブリックIP bash[3335]: } 2月 06 16:28:13 パブリックIP systemd[1]: Started Route53 Set And Timer.
最後に
以上となります。
始めて AWS CLI と Systemd を使って Route53 のレコードの変更を試しましたが、物凄く便利でした。
Systemd は多機能すぎて、全部は覚えれないので今回は、Type=oneshot
だけを覚えていってください!!
会社にJOINしてから約1週間が経ちましたが、若干まだ緊張していてますが、既に楽しい。